"""
基础配置类

提供配置加载的基础功能。
"""

import os
from typing import Optional, Dict, Any
from dotenv import load_dotenv


class BaseConfig:
    """配置基类，提供通用的配置加载和验证功能"""

    def __init__(self):
        """初始化配置，加载环境变量"""
        load_dotenv()

    def _get_env(self, key: str, default: str = "", required: bool = False) -> str:
        """
        安全获取环境变量

        Args:
            key: 环境变量键
            default: 默认值
            required: 是否必需

        Returns:
            str: 环境变量值

        Raises:
            ValueError: 当required=True但变量未设置时
        """
        value = os.getenv(key, default)
        if required and not value:
            raise ValueError(f"环境变量 {key} 未设置")
        return value

    def _get_env_bool(self, key: str, default: bool = False) -> bool:
        """
        获取布尔类型环境变量

        Args:
            key: 环境变量键
            default: 默认值

        Returns:
            bool: 布尔值
        """
        value = os.getenv(key, str(default)).lower()
        return value in ('true', '1', 'yes', 'on')

    def _get_env_int(self, key: str, default: int = 0) -> int:
        """
        获取整数类型环境变量

        Args:
            key: 环境变量键
            default: 默认值

        Returns:
            int: 整数值
        """
        try:
            return int(os.getenv(key, str(default)))
        except ValueError:
            return default

    def _get_env_float(self, key: str, default: float = 0.0) -> float:
        """
        获取浮点数类型环境变量

        Args:
            key: 环境变量键
            default: 默认值

        Returns:
            float: 浮点数值
        """
        try:
            return float(os.getenv(key, str(default)))
        except ValueError:
            return default

    def validate_path(self, path: str, path_name: str = "路径") -> str:
        """
        验证路径的有效性

        Args:
            path: 文件路径
            path_name: 路径名称，用于错误提示

        Returns:
            str: 验证后的路径

        Raises:
            ValueError: 路径不存在时
        """
        if not os.path.exists(path):
            raise ValueError(f"{path_name}不存在: {path}")
        return path